package random_test;

import java.util.*;

public class Test_10_1 {
    //4. 寻找两个正序数组的中位数
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int[] nums = new int[nums1.length + nums2.length];

        int i = 0;
        int j = 0;
        int k = 0;
        while(i < nums1.length && j < nums2.length) {
            if(nums1[i] < nums2[j]) {
                nums[k++] = nums1[i++];
            }else {
                nums[k++] = nums2[j++];
            }
        }
        while(i < nums1.length) {
            nums[k++] = nums1[i++];
        }
        while(j < nums2.length) {
            nums[k++] = nums2[j++];
        }

        int index= (nums1.length + nums2.length) / 2;
        if((nums1.length + nums2.length) % 2 == 1) {
            return (double)nums[index];
        }
        return (nums[index] + nums[index - 1]) / 2.0;
    }


    //6. N 字形变换
    public String convert(String s, int numRows) {
        if(numRows == 1) return s;

        List<StringBuilder> lists = new ArrayList<>();
        for(int j = 0; j < numRows; j++) lists.add(new StringBuilder());

        int i = 0;          //记录当前填入 字符 所在的行数
        int flag = -1;       // 代表 i 移动的方向
        for(char ch : s.toCharArray()) {
            lists.get(i).append(ch);
            if(i == 0 || i == numRows -1) flag = -flag;
            i += flag;
        }

        StringBuilder ret = new StringBuilder();
        for(int j = 0; j < numRows; j++) ret.append(lists.get(j));
        return ret.toString();
    }



    //7. 整数反转
    public int reverse(int x) {
        int ret = 0;
        while(x != 0) {
            int tmp = x % 10;
            // 判断为正数时， 反转结果是否 超出 int 的最大值
            if(ret > 214748364 || ret == 214748364 && tmp > 7 ) return 0;
            // 判断为正数时， 反转结果是否 超出 int 的最大值
            if(ret < -214748364 || ret == -214748364 && tmp > 8) return 0;
            ret = ret * 10 + tmp;
            x /= 10;
        }
        return ret;
    }


    //8. 字符串转换整数 (atoi)
    public static int myAtoi(String s) {
        //跳过字符串前面的空格
        int i = 0;
        for(; i < s.length(); i++) {
            if(s.charAt(i) != ' ') break;
        }

        if(i == s.length()) return 0;
        // 判断转换后整数的符号
        int flag = 1;       // 记录 该整数 是正数还是负数
        if(s.charAt(i) == '-') {
            flag = -flag;
            i++;
        } else if(s.charAt(i) == '+') {
            i++;
        } else if(!Character.isDigit(s.charAt(i))) {
            return 0;
        }

        // 开始 将连续的数字字符转换为 整数
        int ret = 0;
        while(i < s.length() && Character.isDigit(s.charAt(i))) {
            int tmp = (int) (s.charAt(i) - '0') ;
            // 判断为正数时， 反转结果是否 超出 int 的最大值
            if(ret > 214748364 || ret == 214748364 && tmp > 7 ) return 2147483647;
            // 判断为负数时， 反转结果是否 超出 int 的最大值
            if(ret < -214748364 || ret == -214748364 && tmp > 8) return -2147483648;
            ret = ret * 10 + tmp * flag;
            i++;
        }

        return ret;
    }
    
}
